package com.shujia.MR.combiner;


import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
 * KEYIN：表示输入内容偏移量
 * VALUEIN: 表示输入文件中的一行数据，对应类型为字符串 类型为 Text (org.apache.hadoop.io.Text)
 * KEYOUT: 表示输出的Key 类型为Text
 * VALUEOUT: 表示经过Map方法处理后输出的Value  类型为 IntWritable
 */
public class CombinerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    /**
     * protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context)
     * KEYIN: 表示Key对应的输入数据类型
     * VALUEIN：表示Value对应的输入数据类型
     * <p>
     * map方法作用： 用户可以在Map方法中实现对数据的初步处理
     * context: 表示上下文对象，在整个job运行过程中，能够串联Map和Reduce程序
     *
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        // value对应一行数据  hello hadoop 1
        String[] words = value.toString().split(" ");
        for (String word : words) {

            // 通过write方法可以将Map方法计算的结果写出到Reduce端，
            // write中需要传入 Key Value 对应的值，并且其类型和Mapper类中输出的泛型类型一致
            context.write(new Text(word), new IntWritable(1));
        }
    }
}
